package com.myk.game.gobangchess.ai.symmetric;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 文件名: BoundingBoxFinder.java
 * 功能: 提供与棋块包围盒相关的工具函数。
 */
public class BoundingBoxFinder {

    /**
     * 函数名: getBoundingBoxCorners
     * 函数功能: 传入一个棋块的所有坐标，计算并返回其最小包围矩形的四个角点坐标。
     *         矩形的边平行于坐标轴。
     *
     * @param block 输入参数, 代表一个棋块。
     *              格式: List<int[]>。
     *              这是一个坐标列表，其中每个元素 `int[]` 代表一个棋子的坐标 {row, col}。
     *              列表大小可变，取决于棋块大小。
     *
     * @return int[][] 数组, 包含了包围矩形的四个角点坐标。
     *         大小: 4x2。
     *         格式: {{minRow, minCol}, {minRow, maxCol}, {maxRow, minCol}, {maxRow, maxCol}}，
     *         分别代表左上、右上、左下、右下角。
     *         如果输入的棋块为 null 或为空，则返回 null。
     */
    public static int[][] getBoundingBoxCorners(List<int[]> block) {
        if (block == null || block.isEmpty()) {
            return null;
        }

        int minRow = Integer.MAX_VALUE;
        int maxRow = Integer.MIN_VALUE;
        int minCol = Integer.MAX_VALUE;
        int maxCol = Integer.MIN_VALUE;

        for (int[] pos : block) {
            int row = pos[0];
            int col = pos[1];
            minRow = Math.min(minRow, row);
            maxRow = Math.max(maxRow, row);
            minCol = Math.min(minCol, col);
            maxCol = Math.max(maxCol, col);
        }

        return new int[][]{
                {minRow, minCol},   // 左上角 (Top-Left)
                {minRow, maxCol},   // 右上角 (Top-Right)
                {maxRow, minCol},   // 左下角 (Bottom-Left)
                {maxRow, maxCol}    // 右下角 (Bottom-Right)
        };
    }

    /**
     * main 函数用于调用和验证 getBoundingBoxCorners 函数。
     */
    public static void main(String[] args) {
        // 1. 定义一个用于测试的棋块 (一个不规则的形状)
        List<int[]> sampleBlock = new ArrayList<>();
        sampleBlock.add(new int[]{3, 5});
        sampleBlock.add(new int[]{4, 4});
        sampleBlock.add(new int[]{4, 6});
        sampleBlock.add(new int[]{5, 5});
        sampleBlock.add(new int[]{2, 5}); // 添加一个点，改变y的最小值

        System.out.println("--- 验证 getBoundingBoxCorners 函数 ---");
        System.out.print("输入棋块坐标: ");
        for (int[] pos : sampleBlock) {
            System.out.print(Arrays.toString(pos) + " ");
        }
        System.out.println("\n");

        // 2. 调用函数获取最小包围矩形
        int[][] boundingBox = getBoundingBoxCorners(sampleBlock);

        // 3. 打印输出结果
        System.out.println("函数输出结果:");
        if (boundingBox != null) {
            System.out.println("最小包围矩形的四角坐标为 (格式: {row, col}):");
            System.out.println("左上角: " + Arrays.toString(boundingBox[0]));
            System.out.println("右上角: " + Arrays.toString(boundingBox[1]));
            System.out.println("左下角: " + Arrays.toString(boundingBox[2]));
            System.out.println("右下角: " + Arrays.toString(boundingBox[3]));
        } else {
            System.out.println("输入棋块为空，无法计算包围矩形。");
        }
    }
}